# -*- coding: utf-8 -*-
"""
自定义日志记录器
2.1版本：
- 日志文件记录到脚本所在目录的logs目录下
- 日志文件名为脚本名_设备名称.log，没有具体名称就用any代替
- 日志格式为：时间|记录器名称|级别|信息
- 日志文件大小限制为2MB，超过后自动切分，可以自行规定大小
- 显示时间简化为 '%d@%H:%M:%S'

2.2:
- 修正名字不能参与日志文件名命名的bug
"""

import logging
import os
from logging.handlers import RotatingFileHandler
# from datetime import datetime


class MyLogger:
    def __init__(
            self,
            script_path=__file__,
            name=__name__,
            device_id='any',
            rotate_max_size=2*1024*1024,  # 2MB
            ):
        """
        初始化日志记录器
        :param script_path: 调用脚本的路径
        :param name: 日志记录器名称
        :param device_id: 设备ID
        """
        # self.name = name[-10:]
        # self.name = name
        self.logger = logging.getLogger(name)
        self.logger.setLevel(logging.DEBUG)
        print(f"\n日志记录器名称: {name}")
        # 确保日志目录存在
        log_dir = os.path.dirname(script_path)
        log_dir = os.path.join(log_dir, 'logs')
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        # 移除已有的处理器，避免重复记录
        for handler in self.logger.handlers[:]:
            self.logger.removeHandler(handler)
            handler.close()

        # 日志文件名与脚本同名，后缀为.log
        script_name = os.path.splitext(os.path.basename(script_path))[0]
        log_file = os.path.join(
            log_dir,
            f"{script_name}_{name}_{device_id[-10:]}.log"
        )
        print(f"日志文件位置: {log_file}\n")
        # 自定义日志格式
        formatter = logging.Formatter(
            '%(asctime)s|%(name)s|%(levelname)s|%(message)s',
            datefmt='%d@%H:%M:%S'
        )

        # 文件处理器 - 滚动日志，最大2M，保留3个备份
        file_handler = RotatingFileHandler(
            log_file,
            maxBytes=rotate_max_size,  # default @ 2MB
            backupCount=3,
            encoding='utf-8'
        )
        file_handler.setFormatter(formatter)

        # 控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(formatter)

        # 添加处理器
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)

    def debug(self, message):
        """记录调试信息"""
        self.logger.debug(message)

    def info(self, message):
        """记录常规信息"""
        self.logger.info(message)

    def warning(self, message):
        """记录警告信息"""
        self.logger.warning(message)

    def error(self, message):
        """记录错误信息"""
        self.logger.error(message)

    def critical(self, message):
        """记录严重错误信息"""
        self.logger.critical(message)


# 示例用法
if __name__ == "__main__":
    print("=== MyLogger 使用示例 ===")
    print("日志将同时输出到控制台和文件")
    print(f"日志文件位置: {os.path.splitext(__file__)[0]}.log")
    print("=" * 30)

    logger = MyLogger(__file__, rotate_size=1024*1024)

    # 记录不同级别的日志
    logger.debug("这是一条调试信息，用于开发阶段")
    logger.info("程序启动完成，开始执行主要逻辑")
    logger.warning("磁盘空间不足，建议清理")
    logger.error("文件读取失败，请检查路径")
    logger.critical("系统关键错误，需要立即处理")

    # 模拟模块化日志
    logger.info("数据库|连接成功")
    logger.info("用户认证|登录成功|用户: admin")
    logger.error("支付系统|交易失败|订单号: 12345")

    print("=" * 30)
    print("示例执行完成，请检查控制台输出和日志文件")
